<script>
	
/*
Proxy 对象用于创建一个对象的代理，从而实现基本操作的拦截和自定义（如属性查找、赋值、枚举、函数调用等）。
*/
const p = new Proxy(target, handler)

const p = new Proxy(
	{
		name:'Proxy呢'
	},
	{	
		/*
		params
		target 源对象
		key	   属性名
		value  属性值
		receiver 代理对象
		*/
		//handler.set() 方法是设置属性值操作的捕获器。
		set(target, key, value, receiver){
			return Reflect.set(...arguments);
		},

		/*
		params
		target 源对象
		key	   属性名
		receiver 代理对象
		*/
		//handler.get() 方法用于拦截对象的读取属性操作。
		get(target, key, receiver){
			return target[key]
		},

		//handler.getPrototypeOf() 是一个代理（Proxy）方法，
		//当读取代理对象的原型时，该方法就会被调用
		getPrototypeOf(target){
			return {name:'是呢'}
		},

		//handler.setPrototypeOf() 方法主要用来拦截 Object.setPrototypeOf().
		setPrototypeOf(target, prototype){
			target.prototype = prototype
			return true
		},
		
		//handler.defineProperty() 用于拦截对对象的 Object.defineProperty() 操作。
		defineProperty(target, property, descriptor){
			target[property] = descriptor.value
			return true
		},

		//handler.deleteProperty() 方法用于拦截对对象属性的 delete 操作。
		deleteProperty(target, property){
			delete target[property]
			return true
		},

		//handler.getOwnPropertyDescriptor() 方法是 Object.getOwnPropertyDescriptor()  的钩子。
		getOwnPropertyDescriptor(target, prop){
			return Object.getOwnPropertyDescriptor(target,prop)
		},

		//handler.has() 方法是针对 in 操作符的代理方法。
		has(target, prop){
			return prop in target
		},

		//handler.ownKeys() 方法用于拦截 Reflect.ownKeys()
		ownKeys(target){
			return Object.keys(target)
		},

		//handler.isExtensible() 方法用于拦截对对象的Object.isExtensible()。
		isExtensible(target){
			return Object.isExtensible(target)
		},

		//handler.preventExtensions() 方法用于设置对Object.preventExtensions()的拦截
		preventExtensions(target){
			return Object.preventExtensions(target)
		}

	}
)
Object.defineProperty(p,'width',{value:'50px',writable:true,enumerable:true})
delete p.width
let getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor(p,'name')
Reflect.has(p,'name') //true
'width' in p //false
let keys = Reflect.ownKeys(p)
console.log(keys);
Object.preventExtensions(p)
console.log(Object.isExtensible(p));





























</script>